package br.com.windroid.conceitows.ws;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Type;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import util.Singleton;

import br.com.windroid.sigtap.seguranca.entity.Usuario;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

/**
 * Acessar web services do Usuario
 * 
 */
public class UsuarioResource {
	// TODO Substituir printStackTrace por Log
	// TODO Melhorar tratamento de exceção, para trablhar com status HTTP

	private final HttpClient httpClient = new DefaultHttpClient();
	private final String urlService;

	public UsuarioResource() {
		super();
		//this.urlService = "http://192.168.254.3:8080/peri-ws/rest/";
		String ipServidor = Singleton.getInstance().getIpServidor();
		
		this.urlService = "http://"+ipServidor+":8080/peri-ws/rest/";
	}

	public UsuarioResource(String urlService) {
		super();
		this.urlService = urlService;
	}
	

	public Usuario buscarUsuario(long id) {
		HttpGet httGet = new HttpGet(urlService + "usuarios/" + id);
		ResponseHandler<String> handler = new BasicResponseHandler();
		String result = null;
		try {
			result = httpClient.execute(httGet, handler);
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return parseJsonToUsuario(result);
	}

	public Usuario adicionarUsuario(Usuario usuario) {
		String usuarioJson = parseUsuarioToJson(usuario);
		HttpPost httPost = new HttpPost(urlService + "usuarios/salvar/");
		String result = null;
		StringEntity entity = null;
		try {
			entity = new StringEntity(usuarioJson);
			
			httPost.setHeader("Accept", "application/json");
			httPost.setHeader("Content-Type", "application/json");
			
			httPost.setEntity(entity);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		try {
			HttpResponse response = httpClient.execute(httPost);
			result = EntityUtils.toString(response.getEntity());
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return parseJsonToUsuario(result);
	}

	public Usuario atualizarUsuario(Usuario usuario) {
		String usuarioJson = parseUsuarioToJson(usuario);

		HttpPost httPost = new HttpPost(urlService + "usuarios/atualizar");
		String result = null;
		StringEntity entity = null;
		try {
			entity = new StringEntity(usuarioJson);
			
			//entity.setContentType("text/plain");
			
			httPost.setHeader("Accept", "application/json");
			httPost.setHeader("Content-Type", "application/json");

	            
			httPost.setEntity(entity);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		try {
			HttpResponse response = httpClient.execute(httPost);
			result = EntityUtils.toString(response.getEntity());
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return parseJsonToUsuario(result);
	}

	public List<Usuario> buscarUsuarios() {
		HttpGet httGet = new HttpGet(urlService + "usuarios");		
		ResponseHandler<String> handler = new BasicResponseHandler();
		String result = null;
		try {
			result = httpClient.execute(httGet, handler);
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		Gson gson = new Gson();
		Type list = new TypeToken<List<Usuario>>() {
		}.getType();
		List<Usuario> usuarios = gson.fromJson(result, list);
		return usuarios;
	}

	private Usuario parseJsonToUsuario(String json) {
		if (json == null || "".equals(json.trim())) {
			return null;
		}
		Gson gson = new Gson();
		Usuario usuario = gson.fromJson(json, Usuario.class);
		return usuario;
	}

	private String parseUsuarioToJson(Usuario usuario) {
		Gson gson = new Gson();
		String usuarioJson = gson.toJson(usuario);
		return usuarioJson;
	}
}
